package com.google.code.jarquivoretorno.core;

import java.io.File;
import java.io.InputStream;
import java.util.List;

import com.google.code.jarquivoretorno.core.exc.IError;
import com.google.code.jarquivoretorno.layout.LayoutFile;

/**
 * Esta interface defini as ações que devem ser desempenhadas para carregar os
 * arquivos retorno, layout e validação.
 * 
 * É possível vincular apenas um layout por instância, todavia, é permitido
 * inserir diversos Arquivos Retorno.
 * 
 * @since 02/02/2010 09:30:53
 * @author Rafael Freitas de Morais
 * 
 */
public interface ContextoArquivoRetorno {

	/**
	 * Carrega um layout a partir de um {@link InputStream}
	 * 
	 * @param path
	 *            O caminho para o arquivo de layout
	 */
	public void loadLayout(InputStream file);

	
	/**
	 * 
	 * @param layout
	 */
	public void loadLayout(LayoutFile layout);
	
	/**
	 * Adiciona um Arquivo Retorno a partir de um caminho. A versão atual só
	 * permite inserir arquivos localizados na mesma máquina onde o componente
	 * está localizado.
	 * 
	 * @param path
	 *            Caminho físico do arquivo retorno
	 */
	public void addArquivoRetorno(String path);
	
	/**
	 * 
	 * @param dadosArq
	 */
	public void addArquivoRetorno(byte[] dadosArq);

	/**
	 * É possível informar um diretório e capturar todos os arquivos retorno lá
	 * disponíveis.
	 * 
	 * TODO Desenvolver mecanismo capaz de identificar os arquivos retorno a
	 * partir de um filtro de arquivos
	 * 
	 * @param dir
	 *            O diretório que contém os arquivos retorno
	 */
	public void addArquivoRetorno(File dir);

	/**
	 * Indica se houve algum erro de validação
	 * 
	 * @return true se houve erro
	 */
	public boolean hasErrors();

	/**
	 * Retorna os erros encontrados
	 * 
	 * @return
	 */
	public List<IError> getErrors();

	/**
	 * Disponibiliza um novo {@link ArquivoRetornoManager}
	 * @return
	 */
	public ArquivoRetornoManager newArquivoRetornoManager();

}
